package com.cskaoyan.day5.queue._02_api;

import java.util.ArrayDeque;
import java.util.Queue;
import java.util.concurrent.LinkedBlockingQueue;

/**
 * 基础API的使用
 *
 * @author Common-zhou
 * @since 2023-03-03 10:02
 */
public class Demo1 {
    public static void main(String[] args) {
        //test1();

        //test2();

        //test3();

        test4();
    }

    private static void test4() {
        Queue<String> queue = new ArrayDeque<>();

        queue.add("zs");
        queue.add("ls");

        System.out.println(queue.remove());  //zs
        System.out.println(queue.remove());  //ls

        // []
        // 没有元素的时候，remove  会报异常。NoSuchElementException
        //System.out.println(queue.remove());
        // 从队列里获取元素，如果队列为空，会抛异常
        //queue.element();

        // poll 作为一个删除方法，返回元素； 如果队列为空，会返回null
        //System.out.println(queue.poll());
        // 查看队头元素。如果队列为空，返回null
        System.out.println(queue.peek());

    }

    /**
     * 为什么要提供两组API
     * 都是增删查的
     * add（增）：   如果不能添加的时候，会抛出异常
     * remove() 删
     * element() 查
     * <p>
     * offer(增)： 添加，当不能添加的时候；   返回特殊值
     * poll() 删除
     * peek() 查
     */
    private static void test3() {

        //Queue<String> queue = new ArrayDeque<>(2);
        Queue<String> queue = new LinkedBlockingQueue<>(2);
        // 容量有限
        // add 如果队列满了。会直接报错 Queue full
        //queue.add("zs");
        //queue.add("ls");
        //queue.add("wu");
        //queue.add("zl");

        // offer 的返回值 ： true 添加成功
        // false 代表添加失败
        System.out.println(queue.offer("zs"));
        System.out.println(queue.offer("ls"));
        System.out.println(queue.offer("wu"));
        System.out.println(queue.offer("zl"));

        System.out.println(queue);


    }

    private static void test2() {
        //boolean offer(E e):将指定的元素插入此队列（如果立即可行且不会违反容量限制），当使用有容量限制的队列时，此方法通常要优于 add(E)，后者可能无法插入元素，而只是抛出一个异常。
        //E peek(): 获取但不移除此队列的头；如果此队列为空，则返回 null。
        //E poll():获取并移除此队列的头，如果此队列为空，则返回 null。

        Queue<String> queue = new ArrayDeque<>();
        // offer    add 增加元素
        // peek     element 查看元素
        // poll     remove()

        queue.offer("王宇博");
        queue.offer("黄清扬");
        queue.offer("何草");

        // Queue 从队尾进；从队头出
        //    队头         队尾
        //   王宇博   黄清扬      何草

        // peek 只会查看队头元素。不会删除
        System.out.println(queue.peek());
        System.out.println(queue.peek());

        System.out.println(queue);

        // 删除元素。删除队头元素
        System.out.println(queue.poll());
        System.out.println(queue);

        // 黄清扬
        System.out.println(queue.poll());
        // 何草
        System.out.println(queue.poll());

        System.out.println(queue);
    }

    private static void test1() {
        //boolean add(E e): 将指定的元素插入此队列（如果立即可行且不会违反容量限制），在成功时返回 true，如果当前没有可用的空间，则抛出 IllegalStateException。
        //E element() :获取，但是不移除此队列的头。
        //E remove():获取并移除此队列的头。

        Queue<String> queue = new ArrayDeque<>();

        queue.add("zs");
        queue.add("ls");
        queue.add("wu");

        // zs element 只会查看队头元素，不会删除队头元素
        System.out.println(queue.element());
        System.out.println(queue.element());
        System.out.println(queue.element());

        // 先进先出
        String remove = queue.remove();
        System.out.println(remove);
        System.out.println(queue.remove());
        System.out.println(queue.remove());


    }
}
